package com.demo2_两数相加.text1_Long;
/*
     需求: 给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。

请你将两个数相加，并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外，这两个数都不会以 0开头。  2 -> 3 -> 4    4 -> 5 -> 6   实际是 432+654


 */

class ListNode {
    int val;  //  值
    ListNode next; // 下一个结点

    //空参构造
    ListNode() {

    }

    //带参构造
    ListNode(int val) {
        this.val = val;
    }

    //两种带参构造
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

public class Text1 {
    public static void main(String[] args) {
        ListNode listNode2 = new ListNode(9, null);
        ListNode listNode1 = new ListNode(9, listNode2);
        ListNode listNode = new ListNode(1, listNode1);
        System.out.println(listNode);

        ListNode listNode5 = new ListNode(9, null);
//        ListNode listNode4=new ListNode(5,listNode5);
//        ListNode listNode3=new ListNode(4,listNode4);

        Solution ss = new Solution();
        ListNode listNode6 = ss.addTwoNumbers(listNode, listNode5);

        System.out.println(listNode6);


    }
}

//解决方法
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        //1.先将2个链表的信息获取, 转为十进制数字  并 求和
        long sum = getNum(l1) + getNum(l2);
        System.out.println(sum);

//        //0. 如果直接都是0  特殊情况.....
//        if((l1.next==null)&&(l2.next==null))
//            return new ListNode(0,null);
//        if((l1.next==null)&&(l2.next!=null))
//            return l2;
//        if((l2.next==null)&&(l1.next!=null))
//            return l1;

        if (sum == 0)
            return new ListNode(0, null);
        //3.将该和转为链表的形式
        return getNode(sum);
    }

    //转化为数
    public long getNum(ListNode l) {
        if (l == null)
            return 0;
        return l.val + getNum(l.next) * 10;
    }

    //将其转化为链表
    public ListNode getNode(long num) {
        //1.如果该数字为0,则说明为num在上一次循环已经是一个在  0  到 10 之间的数字了
        if (num == 0)
            return null;
        //2.将该数字对10取模
        long value = num % 10;
        return  new ListNode((int)value, getNode(num / 10));
    }
}